package section2_8;

/**
 * Created by Hyman on 2017/6/3.
 *
 * 在锁中使用多条件
 *
 * 与锁绑定的所有条件对象都是通过Lock接口声明的nenConditionO方法创建的。
 * 在使用条件的时候，必须获取这个条件绑定的锁，所以带条件的代码必须在调用lock对象的lock()方法和unlock()方法之间。
 *
 * 备注：当一个线程调用了条件对象的signal()或者signallAll()方法后，一个或者多个在该条件上挂起的线程将被唤醒，
 * 但这并不能保证让它们挂起的条件己经满足，所以必须在while循环中调用await(),在条件成立之前不能离开这个循环。
 * 如果条件不成立，将再次调用await()。
 */
public class Main {

    public static void main(String[] args) {

        // 创建一个文件模拟对象，它有101行
        FileMock mock = new FileMock(101, 10);

        // 创建一个缓冲对象，最多可以缓存20行数据
        Buffer buffer = new Buffer(20);

        // 创建一个生产者对象，并且让它在一个单独的线程中运行
        Producer producer = new Producer(mock, buffer);
        Thread threadProducer = new Thread(producer, "Producer");

        // 创建三个消费者对象，并且个他们分别在不同的线程中运行
        Consumer consumers[] = new Consumer[3];
        Thread threadConsumers[] = new Thread[3];

        for (int i = 0; i < 3; i++) {
            consumers[i] = new Consumer(buffer);
            threadConsumers[i] = new Thread(consumers[i], "Consumer " + i);
        }

        // 启动生产者和消费者线程
        threadProducer.start();
        for (int i = 0; i < 3; i++) {
            threadConsumers[i].start();
        }

    }
}
